package com.binary.coder.gift.core.domain.ai.impl;

import com.binary.coder.gift.core.common.constant.AIModelType;
import com.binary.coder.gift.core.common.constant.ConversationType;
import com.binary.coder.gift.core.domain.ai.AiService;
import com.binary.coder.gift.core.domain.ai.factory.HunYuanFactory;
import com.binary.coder.gift.core.domain.ai.model.HunYuanModelInputParam;
import com.binary.coder.gift.core.domain.ai.model.HunYuanModeloutputParam;
import com.tencentcloudapi.common.AbstractClient;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.hunyuan.v20230901.models.*;
import lombok.extern.slf4j.Slf4j;

/**
 * @author atao
 * @version 1.0.0
 * @ClassName HunyuanClient.java
 * @Description 混元模型客户端
 * @createTime 2024年07月11日 16:39:00
 */
@Slf4j
public class HunyuanClient extends AbstractClient implements AiService<HunYuanModeloutputParam> {

    private static String endpoint = "hunyuan.tencentcloudapi.com";
    private static String version = "2023-09-01";

    public HunyuanClient(Credential credential, String region) {
        this(credential, region, new ClientProfile());
    }

    public HunyuanClient(Credential credential, String region, ClientProfile profile) {
        super(HunyuanClient.endpoint, HunyuanClient.version, credential, region, profile);
    }

    @Override
    public String typeCode() {
        return AIModelType.HUNYUAN.getTypeCode();
    }

    @Override
    public HunYuanModeloutputParam processConversation(ConversationType type, String message) {
        HunYuanModelInputParam req = HunYuanFactory.buildHunYuanModelInputParam(message);
        HunYuanModeloutputParam res = new HunYuanModeloutputParam();
        try {
            switch (type) {
                case TEXT:
                    log.info("hunyuanClient processConversation start");

                    ChatCompletionsResponse response = this.ChatCompletions(HunYuanFactory.buildChatCompletionsRequest(req));
                    HunYuanFactory.fillHunYuanModeloutputParam(response, res);
                    log.info("hunyuanClient processConversation end,res：{}",response);
                    break;
                default:
                    break;
            }
        } catch (Exception e) {
            log.error("{}",e);
        }
        return res;
    }

    /**
     * 腾讯混元大模型是由腾讯研发的大语言模型，具备强大的中文创作能力，复杂语境下的逻辑推理能力，以及可靠的任务执行能力。本接口支持流式或非流式调用，当使用流式调用时为 SSE 协议。
     * <p>
     * 1. 本接口暂不支持返回图片内容。
     * 2. 默认每种模型单账号限制并发数为 5 路，如您有提高并发限制的需求请 [联系我们](https://cloud.tencent.com/act/event/Online_service) 。
     * 3. 请使用 SDK 调用本接口，每种开发语言的 SDK Git 仓库 examples/hunyuan/v20230901/ 目录下有提供示例供参考。SDK 链接在文档下方 “**开发者资源 - SDK**” 部分提供。
     * 4. 我们推荐您使用 API Explorer，方便快速地在线调试接口和下载各语言的示例代码，[点击打开](https://console.cloud.tencent.com/api/explorer?Product=hunyuan&Version=2023-09-01&Action=ChatCompletions)。
     *
     * @param req ChatCompletionsRequest
     * @return ChatCompletionsResponse
     * @throws TencentCloudSDKException
     */
    public ChatCompletionsResponse ChatCompletions(ChatCompletionsRequest req) throws TencentCloudSDKException {
        req.setSkipSign(false);
        return this.internalRequest(req, "ChatCompletions", ChatCompletionsResponse.class);
    }

    /**
     * 腾讯混元 Embedding 接口，可以将文本转化为高质量的向量数据。
     *
     * @param req GetEmbeddingRequest
     * @return GetEmbeddingResponse
     * @throws TencentCloudSDKException
     */
    public GetEmbeddingResponse GetEmbedding(GetEmbeddingRequest req) throws TencentCloudSDKException {
        req.setSkipSign(false);
        return this.internalRequest(req, "GetEmbedding", GetEmbeddingResponse.class);
    }

    /**
     * 该接口用于计算文本对应Token数、字符数。
     *
     * @param req GetTokenCountRequest
     * @return GetTokenCountResponse
     * @throws TencentCloudSDKException
     */
    public GetTokenCountResponse GetTokenCount(GetTokenCountRequest req) throws TencentCloudSDKException {
        req.setSkipSign(false);
        return this.internalRequest(req, "GetTokenCount", GetTokenCountResponse.class);
    }

    /**
     * 混元生图接口基于混元大模型，将根据输入的文本描述，智能生成与之相关的结果图。分为提交任务和查询任务2个接口。
     * 提交任务：输入文本等，提交一个混元生图异步任务，获得任务 ID。
     * 查询任务：根据任务 ID 查询任务的处理状态、处理结果，任务处理完成后可获得生成图像结果。
     * 并发任务数（并发）说明：并发任务数指能同时处理的任务数量。混元生图默认提供1个并发任务数，代表最多能同时处理1个已提交的任务，上一个任务处理完毕后才能开始处理下一个任务。
     *
     * @param req QueryHunyuanImageJobRequest
     * @return QueryHunyuanImageJobResponse
     * @throws TencentCloudSDKException
     */
    public QueryHunyuanImageJobResponse QueryHunyuanImageJob(QueryHunyuanImageJobRequest req) throws TencentCloudSDKException {
        req.setSkipSign(false);
        return this.internalRequest(req, "QueryHunyuanImageJob", QueryHunyuanImageJobResponse.class);
    }

    /**
     * 混元生图接口基于混元大模型，将根据输入的文本描述，智能生成与之相关的结果图。分为提交任务和查询任务2个接口。
     * 提交任务：输入文本等，提交一个混元生图异步任务，获得任务 ID。
     * 查询任务：根据任务 ID 查询任务的处理状态、处理结果，任务处理完成后可获得生成图像结果。
     * 并发任务数（并发）说明：并发任务数指能同时处理的任务数量。混元生图默认提供1个并发任务数，代表最多能同时处理1个已提交的任务，上一个任务处理完毕后才能开始处理下一个任务。
     *
     * @param req SubmitHunyuanImageJobRequest
     * @return SubmitHunyuanImageJobResponse
     * @throws TencentCloudSDKException
     */
    public SubmitHunyuanImageJobResponse SubmitHunyuanImageJob(SubmitHunyuanImageJobRequest req) throws TencentCloudSDKException {
        req.setSkipSign(false);
        return this.internalRequest(req, "SubmitHunyuanImageJob", SubmitHunyuanImageJobResponse.class);
    }


}
